/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.Controller;

import com.Model.Acervo;
import com.Model.AcervoCampo;
import com.Model.AcervoConteudo;
import com.Model.AcervoRegistro;
import com.Model.Repositories.AcervoConteudoRepository;
import com.Model.Repositories.AcervoRegistroRepository;
import com.Model.Repositories.AcervoRepository;
import com.Util.Arquivo;
import com.Util.Thumbnail;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import org.apache.commons.net.ftp.FTPClient;
import org.richfaces.datahelper.SessionDataHelper;
import org.richfaces.event.FileUploadEvent;

/**
 *
 * @author Fellipe
 */
@ManagedBean
@ViewScoped
public class NovoRegistroBean implements Serializable {

    private AcervoRegistro registro;
    private AcervoConteudo conteudoAux;
    private Arquivo data;
    private Integer oi;
    private AcervoRegistro registroAux;
    private Integer chaveCampoAux;
    private String textoLongo;

    public Integer getChaveCampoAux() {
        return chaveCampoAux;
    }

    public void setChaveCampoAux(Integer chaveCampoAux) {
        this.chaveCampoAux = chaveCampoAux;
    }

    public AcervoRegistro getRegistroAux() {
        return registroAux = buscaRegistro();
    }

    public void setRegistroAux(AcervoRegistro registroAux) {
        this.registroAux = registroAux;
    }

    public Integer getOi() {
        return oi;
    }

    public void setOi(Integer oi) {
        this.oi = oi;
    }

    public NovoRegistroBean() {

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        int id = Integer.parseInt(params.get("chave"));
        Acervo a = new AcervoRepository().read(id);

        registro = new AcervoRegistro();
        registro.setChaveAcervo(id);
        registro.setConteudo(new ArrayList<AcervoConteudo>());
        System.out.println("ble");

        for (AcervoCampo ac : a.getAcervoCampo()) {
            AcervoConteudo acon = new AcervoConteudo();
            acon.setCampo(ac.getCampo());
            acon.setValorPadrao(ac.getValorPadrao());
            acon.setApresentacao(ac.getApresentacao());
            acon.setRestricao(ac.getRestricao());
            acon.setSubcampos(ac.getSubcampos());
            acon.setRepetitivo(ac.getRepetitivo());
            acon.setObrigatorio(ac.getObrigatorio());
            acon.setChaveMetadado(ac.getChaveMetadado());
            acon.setPublicar(ac.getPublicar());
            acon.setNivelAcesso(ac.getNivelAcesso());
            acon.setSequencia(ac.getSequencia());
            acon.setValor(acon.getValorPadrao());
            acon.setChaveRegistro(id);
            this.registro.getConteudo().add(acon);
        }

    }

    public AcervoConteudo getConteudoAux() {
        return conteudoAux;
    }

    public void setConteudoAux(AcervoConteudo conteudoAux) {
        this.conteudoAux = conteudoAux;
    }

    public AcervoRegistro getRegistro() {
        return registro;
    }

    public void setRegistro(AcervoRegistro registro) {
        this.registro = registro;
    }

    public void create() {
        
        ArrayList<AcervoConteudo> listaAux = new ArrayList<AcervoConteudo>();
        
        for (AcervoConteudo acon : registro.getConteudo()) {
            System.out.println(acon.getCampo().getTitulo() + ": " + acon.getValor());
            if (!acon.getValor().isEmpty()) {
                listaAux.add(acon);
            }
        }
        
        this.registro.setConteudo(listaAux);
        
        new AcervoRegistroRepository().create(this.registro);
    }

    public void addRow() {
        AcervoConteudo acon = new AcervoConteudo();
        acon.setCampo(this.conteudoAux.getCampo());
        acon.setChaveCampo(this.conteudoAux.getChaveCampo());
        acon.setValorPadrao(this.conteudoAux.getValorPadrao());
        acon.setApresentacao(this.conteudoAux.getApresentacao());
        acon.setRestricao(this.conteudoAux.getRestricao());
        acon.setSubcampos(this.conteudoAux.getSubcampos());
        acon.setRepetitivo(this.conteudoAux.getRepetitivo());
        acon.setObrigatorio(this.conteudoAux.getObrigatorio());
        acon.setChaveMetadado(this.conteudoAux.getChaveMetadado());
        acon.setPublicar(this.conteudoAux.getPublicar());
        acon.setNivelAcesso(this.conteudoAux.getNivelAcesso());
        acon.setSequencia(this.conteudoAux.getSequencia());
        registro.getConteudo().add(acon);
    }

    public void delRow() {
        registro.getConteudo().remove(this.conteudoAux);
    }

    public void paint(OutputStream stream, Object object) {
        try {
            Object restoredData = SessionDataHelper.getDataByKey(object);
            BufferedImage buf = (BufferedImage) restoredData;
            ImageIO.write(buf, "JPG", stream);
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void uploadListener(FileUploadEvent event) {

        data = new Arquivo(event.getUploadedFile());

    }

    public List<AcervoConteudo> autocomplete(String busca) {
        System.out.println(busca);
        System.out.println(chaveCampoAux);
        return new AcervoConteudoRepository().busca(busca, chaveCampoAux);
    }

    public AcervoRegistro buscaRegistro() {
        if (this.oi != null) {
            AcervoConteudo acon = new AcervoConteudoRepository().read(this.oi);
            AcervoRegistro aRes = new AcervoRegistroRepository().read(acon.getChaveRegistro());
            return aRes;
        } else {
            return registroAux;
        }

    }

    public void upload(String nomeArq) {

        try {
            FTPClient f = new FTPClient();
            f.connect("201.22.59.253", 21);
            f.login("acervo_cliente", "videogastro");

            if (f.isConnected()) {
                f.setFileType(FTPClient.BINARY_FILE_TYPE);
                f.storeFile("/Temp/" + nomeArq, new ByteArrayInputStream(data.getData()));

                f.disconnect();

            } else {
                System.out.println("Não conseguiu conexão");
            }
        } catch (SocketException ex) {
            System.out.println(ex);
        } catch (IOException ex) {
            System.out.println(ex);
        }

    }

    public void manuseiaDadosUpload(AcervoConteudo ac) {

        String nomeArquivo = null;
        if (data != null || nomeArquivo == null) {
            nomeArquivo = new Date().getTime() + data.getName().substring(data.getName().lastIndexOf("."), data.getName().length());
        }

        try {

            if (ac.getCampo().getTipoCampo().getChaveTipoCampo() == 2) {
                //documento

                this.upload(nomeArquivo);
                ac.setNomeOrigem(nomeArquivo);
                ac.setValor(nomeArquivo);

            } else if (ac.getCampo().getTipoCampo().getChaveTipoCampo() == 3) {
                //imagem

                this.upload(nomeArquivo);
                ac.setNomeOrigem(data.getName());
                ac.setNomeDestino(nomeArquivo);
                ac.setValor(nomeArquivo);
                ac.setRtf(data.getExtension());
                ac.setBlob(new Thumbnail().imagem(data));

            } else if (ac.getCampo().getTipoCampo().getChaveTipoCampo() == 6) {
                //multimidia

                this.upload(nomeArquivo);
                ac.setNomeOrigem(nomeArquivo);
                ac.setValor(nomeArquivo);

            } else if (ac.getCampo().getTipoCampo().getChaveTipoCampo() == 9) {
                //texto longo

                ac.setBlob(ac.getValor().getBytes());
                ac.setValor(null);

            }

        } catch (IOException ex) {
            System.out.println(ex);
        } finally {
            System.out.println("prontinho");
        }

//        try {
//            //miniatura
//
//            ImageIcon imgIco = new ImageIcon(data);
//            imgIco.setImage(imgIco.getImage().getScaledInstance(160, 120, 100));
//
//            Image img = imgIco.getImage();
//            BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
//            Graphics2D g2 = bi.createGraphics();
//            g2.drawImage(img, 0, 0, null);
//            g2.dispose();
//
//            ByteArrayOutputStream baos = new ByteArrayOutputStream();
//            ImageIO.write(bi, "png", baos);
//            baos.flush();
//            byte[] a = baos.toByteArray();
//            baos.close();
//
//            //fim miniatura
//            //adiciona miniatura ao objeto
//            ac.setImagem(a);
//            ac.setValor(file.getName());
////            AcervoConteudo aco = new AcervoConteudo();
////            aco.setCampo(ac.getCampo());
////            aco.setValor(null);
////            registro.getConteudo().add(aco);
//            //fim adiciona miniatura ao objeto
//
//            FTPClient f = new FTPClient();
//            f.connect("201.22.59.253", 21);
//            f.login("acervo_cliente", "videogastro");
//
//            if (f.isConnected()) {
//                f.setFileType(FTPClient.BINARY_FILE_TYPE);
//                f.storeFile("/Temp/" + file.getName(), new ByteArrayInputStream(data));
//
//                f.disconnect();
//
//            } else {
//                System.out.println("Não conseguiu conexão");
//            }
//
//        } catch (FileUploadException ex) {
//            System.out.println("Erro: " + ex.getMessage());
//        } catch (IOException ex) {
//            System.out.println("Erro: " + ex.getMessage());
//        }
    }

    public String[] listaRestricao(AcervoConteudo acon) {

        return acon.getRestricao().split(";");

    }

    public boolean ehApresentacao(AcervoConteudo cont, AcervoConteudo reg) {

        String[] valor = cont.getApresentacao().split(";");

        for (String v : valor) {
            if (!v.equals("")) {
                if (reg.getCampo().getChaveCampo() == Integer.parseInt(v)) {
                    return true;
                }
            }

        }

        return false;

    }
}
